"""
    管理定时任务：每隔 5s 读取所有 已连接的客户端的寄存器 数据
    twisted 内置的定时调度，运行在主线程， 所以从性能考量，
    使用 APScheduler 任务调度模块，定时任务在后台线程运行，不抢占主线程的 CPU 运算时间
"""
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor
from twisted.internet import reactor
from utils import *

FORMAT = ('%(asctime)-15s %(threadName)-15s'
          ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
_logger = logging.getLogger()
_logger.setLevel(logging.DEBUG)

#factory = None


def task_collecting_data(factory=None):
    """ 周期任务： 采集 PLC数据 """
    if not factory:
        return

    print_threading_info()

    for client in factory.clients:
        # 采集 PLC数据
        client.collecting_machine_status()
        client.collecting_spinning_status()
        client.collecting_spinning_speed()
        client.collecting_config_data()

    # 3秒
    reactor.callLater(5, task_collecting_data, factory)


def run_schedule( factoryObject = None ):
    """ 不再使用 APSchudler 来做定时任务 """
    executors = {
        'default': ThreadPoolExecutor(5),
    }
    scheduler = BackgroundScheduler(executors=executors)

    # factory 保存有 PLC连接的 套接字队列
    # global factory
    # factory = factoryObject

    # 启动任务调度器， 每个 5s 从全部 plc单片机 采集一次 数据
    # TODO 现在是一个线程采集所有 plc clients,
    # 在 clients 达到一定数量后，要分多个线程， 每个线程采集
    # scheduler.add_job(task_collecting_data, 'interval', seconds=5)
    # scheduler.start()

    # 运行 上传的线程
    # from data_sync.upload_data import upload_main
    # t = threading.Thread(target=upload_main, name="upload_main")
    # t.start()
    # t.join()

